package controller.listeners.posprocessingFrg;


import model.PosProcessingForeignsModel;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import domain.Center;


import business.ViewLogger;
import view.PosProcessingForeignsView;
import view.ViewUtils;

/**
 * Controlador de pulsacion de teclas sobre la tabla de rps
 * @author 53385255R
 *
 */
public class RPsKeyDownListener implements Listener {


	private PosProcessingForeignsView _view;
	private PosProcessingForeignsModel _model;
	
			/**
			 * @param view
			 * @param model
			 */
			public RPsKeyDownListener(PosProcessingForeignsView view,
					PosProcessingForeignsModel model) {
				this._model = model;
				this._view = view;
			}
			
			/**
			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
			 */
			@Override
			public void handleEvent(Event event) {
			
				if (event.keyCode == SWT.CR) {
						Center cenW = null;

						String piod = "ES -- ---- ------ --------";
						
						while ((cenW == null)&&(piod != "")&&(piod != null)) {
							piod = ViewUtils.getInstance().textMessage("Escriba el PIOD a codificar", "Escriba el PIOD para codificar el corp separado por espacios o tabuladores. Use el patrón: ISO -- ---- ------ --------\nISO solo obligatorio para extranjeros o si se inserta el sector.\n*Si se inserta el PIOD con ISO y sector, el código de sector será ignorado.\n*Si inserta ISO Prov e Instit (opcionalmente también Org), el resto del PIOD se completará automáticamente con guiones.", piod);
							cenW = getCenter(piod);
							if ((cenW == null)&&(piod != "")) ViewUtils.getInstance().informationMessage("Error en la forma de escribir el PIOD", "Ha escrito un PIOD inválido. Utilice el siguiente patrón: ISO -- ---- ------ --------.", false);
						}
						if (cenW != null) {
							boolean doit = true;
							//comprobamos si el Centro existe en maesorg (los extranjeros no hay que comprobarlos)
							//y tambien si existe en candidatos
							if ((cenW.getINSTIT() != "9") && (!_model.existsInMaesorg(cenW))) {
								doit = false;
								ViewUtils.getInstance().informationMessage("PIOD no existente", "El centro que ha proporcionado no existe en Maesorg.\nDebe insertarlo previamente en Maesorg manualmente.", false);
							
							}
							
							if (doit) {
								if (_model.insertSelectedRP(cenW)) {
									_view.setIDNOS(_model.get_idnos());
									//después del proceso marcará en la vista el idno procesado o el siguiente
									_view.focusIdno(_model.getIndexSelect(_model.get_selected_idno()));
									_model.set_selected_idno(_model.get_selected_idno());
									_view.setRPs(_model.get_rps());
									_view.setCO0s(_model.get_co0s());
														
									
								}
							}
						}	

				} else if (((event.keyCode == 119) || (event.keyCode == 87)) &&  (event.stateMask == SWT.CTRL)) {
					_view.copyRP();
				} else if  (event.keyCode == SWT.F1) {
				
					
					String help = 		"\n\nACCIONES PARA EL POSTRATAMIENTO\n- Intro o Doble Click: Se abre una ventana para insertar el PIOD con el que codificar el RP a insertar en CO0." +
					"\n- Ctrl + w: Copia el contenido del corp\n- Supr: Borra el RP del CO0 Y su codificación (aún no está implantado).";
					ViewUtils.getInstance().informationMessage("Ayuda tabla rps", help,true);
					ViewLogger.getInstance().info(help);
			
				}else if (event.keyCode==127){
					ViewLogger.getInstance().info("Debería Borrar La codificación del RP, y el registro del co0");
				}
			}
			
			private Integer getNumCharacter(char character) {
				Integer num = null;
				try {
					num = Integer.parseInt(character+"");
				} catch (NumberFormatException e) {
					
				}
				
				return num;
			}
			
			
			/**
			 * Devuelve null si no es posible crear el centro a partir del codigo dado. 
			 * Si INSTIT es 9 e ISO es 'ES' se devuelve null también.
			 * Cuando Prov, instit, org o dpto contienen dos guiones, se les da el formato correcto de guiones
			 * @param piod (Se asume que es ISO = 'ES' si no se da ninguno
			 * @return centro para su insercion
			 */
			private Center getCenter(String piod) {
				
				if (piod != null) { 
					piod = piod.replaceAll("\t", " ");
					piod = piod.replaceAll("\r", " ");
					piod = piod.replaceAll("\n", " ");
					piod = piod.replaceAll(" {2,}", " ");
					piod = piod.replaceAll("^ ", "");
					piod = piod.replaceAll(" ", "/");
					String[] spls = piod.split("/");
					
					if ((spls.length < 3) || (spls.length > 6)) return null;
					else {
						String ISO = "ES";
						String Prov = "";
						String Instit = "";
						String Org = "";
						String Dpto = "";
						String Sector = "";
					
						if ((spls.length == 4) && (!spls[0].equals("ES"))) {
							Prov = spls[0];
							Instit = spls[1];
							Org = spls[2];
							Dpto = spls[3];
						} else if (spls.length > 4) {
							ISO = spls[0];
							Prov = spls[1];
							Instit = spls[2];
							Org = spls[3];
							Dpto = spls[4];
						} else if (spls.length == 3) {
							ISO = spls[0];
							Prov = spls[1];
							Instit = spls[2];
							Org = "------";
							Dpto = "--------";
						} else if ((spls.length == 4) && (spls[0].equals("ES"))) {
							ISO = spls[0];
							Prov = spls[1];
							Instit = spls[2];
							Org = spls[3];
							Dpto = "--------";
						}
						
						//Corrijo los guiones por si falta alguno o hay de más
						Prov = (Prov.contains("--"))? "--":Prov;
						Instit = (Instit.contains("--"))? "----":Instit;
						Org = (Org.contains("--"))? "------":Org;
						Dpto = (Dpto.contains("--"))? "--------":Dpto;
						
						//Buscamos el sector en la cache
						Sector = "";
						
						//No se permiten mezclar ISOS extranjeros con instit españoles o instit 9 con iso español
						if (Instit.equals("9") && ISO.equals("ES")) return null;
						if (!Instit.equals("9") && !ISO.equals("ES")) return null;
						
						return new Center(ISO, Prov, Instit, Org, Dpto,Sector);
					}
				}
				
				return null;
					
			}
			
		}